home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1996 April
/
CHIP 1996 aprilis (CD06).zip
/
CHIP_CD06.ISO
/
hypertxt.arj
/
9501
/
EMACS.CD
< prev
next >
Wrap
Text File
|
1995-10-28
|
20KB
|
346 lines
@VAz Emacs program editor@N
@VUnix programozási eszközök I.@N
Azok számára, akik megszokták a Borland programozási
környezetét, az ablakokat, a gyors fordítást és az online
helpet, elôször egy kicsit fapadosnak tûnnek a Unix
lehetôségei. Az elsô dolog, ami az ilyen csillogó-villogó
dolgokhoz hozzászokott embereket elrettenti, az általában a
""szabvány" Unixos szövegszerkesztô, a @Kvi@N. Ezek után
következnek a kacifántosabb, több tapasztalatot igénylô
dolgok. Ilyenek például a @Kmake@N, a @Klex@N, a @Kyacc@N, a @Klint@N, a
@Kprofilerek@N -- a felsorolást sokáig lehetne folytatni.
Még egy C fordító hatékony használata is igényel némi
tapasztalatot. A hatékony kódolás mellett még van több más
probléma is. Ilyen például a hordozhatóság: ami az egyik
gépen mûködik, nem biztos, hogy máshol is fog (vagy, hogy
máshol is ugyanúgy fog). Vannak programok, amelyek segítenek
ennek a problémának a megoldásában is, de -- mint minden
segédeszköz használatához -- szükséges bizonyos tapasztalat
ezekhez is. Ráadásul a legtöbb Unixos programozói eszköz
különálló egység, nem egy nagy rendszer része, nem alkotnak
egy integrált fejlesztôi környezetet. Emiatt van szükség
arra, hogy minden egyes program használatát külön
megtanuljuk, ez pedig sokakat elkedvteleníthet.
Akiket viszont ezek a dolgok nem tántorítanak el, és
komolyabban belemerülnek a Unix alatti programozásba, hamar
észrevehetik, hogy ez a rendszer nagyon is támogatja a
fejlesztés összes lépését, és ezek a programok jóval
hatékonyabb munkát tesznek lehetôvé, mint sok integrált
fejlesztôi környezet. Persze valódi problémaként megmarad az
információhiány: kevés a magyar nyelven könnyen elérhetô
szakirodalom. Egy cikkben nem is vállalkozhatunk ennek a
problémának a megoldására, nem is ez a cikk célja, csak az,
hogy bemutassa egy kicsit (amennyire a cikk írójának szerény
tapasztalatából futja) a Unix rendszer alatt használható
programfejlesztôi eszközöket. A cikkben általában a unixos
lehetôségekrôl lesz szó, ahol pedig egyedi programokról
beszélünk, ott a GNU programokat és a Linux (szabad Unix
klón) operációs rendszert vesszük alapul.
Hogyan néz ki tehát nagy vonalakban egy program
megvalósítása (a tervezés -- egyébként nagyon fontos --
lépcsôfokát kihagyva)? Milyen eszközök szükségesek hozzá? A
programfejlesztés minden egyes fázisához -- program
megírásához, a fordításhoz, a teszteléshez, a
dokumentációhoz, a karbantartáshoz -- más típusú eszközökre
van szükség. A legelsô -- és általában egyben a legfontosabb
-- lépést, a program megtervezését most kihagyjuk, mivel ez
másfajta eszközöket igényel (sok DOS-os program
használatakor egyébként is úgy tûnik, mintha ezt a lépést a
gyakorlatban is elhanyagolták volna).
@VAz Emacs@N
Kezdjük barangolásunkat a szövegszerkesztôknél. A két
legfontosabb Unixos szövegszerkesztô az Emacs és a @Kvi@N
(betûrendben). Ezek közül az Emacset vizsgáljuk meg
részletesebben, potosabban ennek programozói vonásait.
Egy kis történelem: az Emacs szövegszerkesztôt Richard
Stallman készítette, neve az @KEditing MACroS@N kifejezésbôl
származik. (Richard Stallman az egyik leghíresebb
programozó, a GNU projekt elindítója és az FSF alapítója.)
Az Emacs egyik ôse az MIT-n kifejlesztett TECO nevû
programozható szövegszerkesztô. (A TECO egy olyan
szövegszerkesztô, amely képes bármilyen karaktersorozatot
parancsként értelmezni. Ezt szó szerint kell érteni: az
MIT-n sokszor játszották azt, hogy kitalálták: ha a TECO-nak
parancsként beírják valakinek a nevét, mi fog történni.) Az
Emacs szövegszerkesztônek rengeteg változata van, mi most a
GNU Emacset vesszük alapul.
@VEmacs = rejtôzködô LISP interpreter@N
Ennek a szövegszerkesztônek a koncepciója eléggé egyedi:
teljes egészében egy -- speciális tulajdonságokkal
felruházott -- LISP értelmezôprogramra épül. Ez azt jelenti,
hogy nagy része LISP-ben van írva, bôvítésének módja újabb
LISP függvénykönyvtárak megírása. Persze anélkül is lehet
használni, hogy valaki egyáltalán tudná azt, hogy mi is az a
LISP, és lehetôségeinek nagy részét el lehet érni
mindenfajta varázslások nélkül is.
Kezdjük tehát a legelején. A szövegszerkesztô az @Kemacs@N
parancs kiadására indul. Erre betöltôdik a program, majd a
gép és a felhasználóspecifikus konfigurációs állományok
feldolgozására kerül sor. A felhasználói konfigurációs file
is LISP nyelven van írva, de legtöbbször csak
billentyû-definíciókat és értékadásokat tartalmaz, ezeknek a
szintaktikáját még egyszerû megtanulni.
Az elsô kérdés, amit meg kell válaszolni: hogyan lehet
segítséget kérni? Az Emacsnek eléggé kiterjedt súgórendszere
(help) van. Ha lenyomjuk a [Ctrl H]-t kétszer egymás után,
egy ablakban segítséget kapunk a súgórendszer használatához.
Kérhetünk leírást egy funkcióról, megnézhetjük, hogy egy
billentyûhöz milyen funkció van hozzárendelve, elolvashatunk
egy teljes Emacs referenciát, információt kérhetünk az Emacs
fô- és alüzemmódjairól, változóiról és
szubrutinkönyvtárairól. Elôször bonyolultnak tûnhet a sok
hosszú control/alt/shiftes bilentyûkombináció, de egy kis
gyakorlat után sokkal hatékonyabban lehet az Emacs -- nagyon
jól kidolgozott -- szöveges lehetôségeit használni, mint
állandóan menükben keresgélni.
Mint már említettem, a szövegszerkeztô minden egyes
funkcióját egy LISP függvény valósítja meg. Ezeknek
természetesen van nevük, és nem kell minden parancs
billentyûkombinációját fejben tartanunk, hanem az [Alt X]
billentyûk lenyomása után közvetlenül is kiadhatjuk ôket.
Vannak olyan parancsok is, amelyeket alapállapotban csak így
lehet kiadni. Numerikus argumentumot egy parancsnak a [Ctrl
U] lenyomása után adhatunk meg (még a parancs kiadása -- az
[Alt X] lenyomása -- elôtt). Ha csak egy részére emlékszünk
egy parancsnak, vagy meg akarjuk kerestetni azokat, amelyek
egy bizonyos típusú mûveletet végeznek, használhatjuk a
[Ctrl H] [A] kombinációt. Például a [Ctrl H] [A] @Kregion@N
parancs felsorolja az összes olyan Emacs LISP függvényt,
amelynek a nevében szerepel a @Kregion@N szó -- tehát az összes
olyan függvényt, amellyel blokkmûveleteket lehet végezni.
@VAblak- és pufferkezelés@N
Az Emacsben a szerkesztés alapvetô egysége a puffer
(buffer). A szerkesztômûveleteket egy puffer tartalmán, vagy
annak egy részén végezzük. Amit viszont a képernyôn látunk,
az általában kettô vagy több ablak. Egy ablak mindig egy
puffer egy részét mutatja. Az ablakok és a pufferek
függetlenek egymástól olyan tekintetben, hogy az egyik egy
példányának megszûnése vagy létrejötte nem befolyásolja a
másik egyik példányának létét sem. Ha tehát eltüntetünk a
képernyôrôl egy ablakot, az nem jelenti azt, hogy megszûnt
az a puffer, aminek a tartalmát eddig abban az ablakban
szerkesztettük. Egy listát kérhetünk az összes puffer
állapotáról a [Ctrl X] [Ctrl B] billentyûkombinációval. (Ez
nem ugyanaz, mint a [Ctrl X] [B]!)
Az ablakokat vízszintesen és függôlegesen is
kettéoszthatjuk, megváltoztathatjuk méreteiket, és
kijelölhetjük, hogy melyik puffert szerkesztjük bennük. Az
ablakok függôleges kettéosztása a [Ctrl X] [3], vízszintes
kettéosztása a [Ctrl X] [2] parancsokkal történik. A
következô ablakra a [Ctrl X] [O] billentyûkkel ugorhatunk.
Bezárni egy ablakot a [Ctrl X] [0], teljes képernyôsre
nagyítani pedig a [Ctrl X] [1] kombinációval tudunk. Egy
file-t megnyitni az aktuális ablakban [Ctrl X] [Ctrl F]-fel
tudunk, az aktuális ablak által mutatott puffert a [Ctrl X]
[B] paranccsal lehet megváltoztatni.
Az Emacs minden egyes pufferhez rendel egy fô
szerkesztési üzemmódot, és minden pufferhez rendelhet
szerkesztési alüzemmódokat (major and minor modes.) Ezek
szabályozzák például a billentyûlenyomásokhoz rendelt
funkciókat vagy a puffer tartalmának megjelenítését. Más
jelentés van például a [Tab] billentyûhöz rendelve C módban
mint a Fundamental (alap) módban. Ez egy kicsit pontosabban
a következôket jelenti: az Emacs minden egyes billentyû
leütésekor végrehajt egy LISP függvényt. Azt, hogy melyik
billentyûhöz milyen függvény tartozik, táblázatokból dönti
el: van egy globális táblázat, amely mindegyik üzemmódra
érvényes, és vannak módokhoz rendelt lokális táblázatok,
amelyeknek az érvényességi köre csak a megfelelô módú
pufferekre terjed ki. Elôször természetesen a lokális, majd
sikertelenség esetén a globális táblázatban keres, és
végrehajtja a megfelelô függvényt. Ez például az
alfanumerikus kódok esetén a @Kself-insert-command@N. Ez
egyszerûen beilleszti a pufferbe annak a billentyûnek a
kódját, amelyiknek a leütése miatt meghívódott, így nem kell
mindig megadni azt, hogy az [A] billentyû lenyomására az
""a" karakter kerüljön bele a pufferbe, hanem elég
alapértelmezésben ezzel a függvénnyel feltölteni a megfelelô
táblázatot.
Ez eddig igen bonyolultan hangzott, pedig alapjában véve
egyszerû és logikus. Összefoglalásként: az Emacs alapja az
Emacs LISP értelmezôprogram. Ez egyszerû LISP interpreter,
felruházva néhány speciális, a szövegszerkesztéshez
szükséges tulajdonsággal. Ilyen például a pufferek és az
ablakok kezelése, billentyûzetkezelés, gyors szövegkezelô
függvények. Ha alaposabban belegondolunk, ez nagyon komoly
lehetôségeket biztosít a programozó számára: az editor
szinte bármelyik részét kedve szerint alakíthatja, egy olyan
nyelven, amely támogatja ôt, amelybôl elérheti a
szövegszerkesztô összes lehetôségét, de amely ugyanakkor egy
különálló -- és ráadásul elég ismert, és a megfelelô
területeken elég hatékony -- programozási nyelvre épül.
@VBôvítések@N
Az Emacs bôvíthetôségét sokan kihasználták már, sok
olyan függvénykönyvtár van amely elég speciális
szövegszerkesztési -- és nem csak szövegszerkesztési --
feladatok megoldására készült. Lehet levelezni, USENET
news-t olvasni, amôbát játszani vele. Ha nagyon unatkozunk,
nézhetjük, miközben megoldja a Hanoi Tornyai feladatot. És
ha végképp nem bírunk zöldágra vergôdni valamivel,
forduljunk csak nyugodtan az Emacshez: írjuk be, hogy [Alt
X] @Kdoctor@N, és hosszú (bár nem túl intelligens) beszélgetést
folytathatunk az egyik klasszikus -- és korának megfelelô
színvonalú -- mesterséges intelligencia programmal.
Ezek persze nem tartoznak az Emacs legfontosabb
feladatai közé. A valóban komoly és igen jól használható
lehetôségek közé tartozik viszont az, hogy aszinkron módon
tudunk programot fordítani: miközben a rendszer fordít, mi
már javíthatjuk is az idôközben felmerült hibákat (ez persze
az Emacs DOS-os változatánál nem így mûködik,) a rengeteg
gépelésgyorsító funkció (ezek persze nem a gépelést
gyorsítják, hanem a begépelendô szöveg mennyiségét
csökkentik), vagy a nagyon rugalmas programozhatóság. Az
Emacs egyik üzemmódját például Interaktív Lisp módnak
hívják, mivel azonnal kiértékeli, amit beírunk a pufferbe,
és kiírja az eredményt (így persze nagyon leegyszerûsödik a
szövegszerkesztô bôvítések kipróbálása, sôt, ezt a
lehetôséget használhatjuk egyszerû algoritmusok gyors
kipróbálására is.)
Mielôtt rátérnénk az Emacs programfejlesztés-specifikus
aspektusaira, szeretném megjegyezni, hogy hatékonyan lehet
vele más típusú szövegeket is szerkeszteni. Bár nincsen
saját file-formátuma, vannak olyan szerkesztési üzemmódjai,
amelyek jól alkalmazkodnak például a TeX, HTML vagy SGML
formátumokhoz.
@VIntegrált fejlesztôi környezet@N
Fontos képessége az Emacs-nek, hogy hatékonyan képes
integrálni már meglévô fejlesztôi eszközöket. Ennek
segítségével tulajdonképpen rendelkezik a DOS alatt
megszokott fejlesztôi környezetek minden tulajdonságával:
tudunk programot fordítani, nyomkövetni stb. A
programfordítást Unix alatt legtöbbször a make
segédprogrammal végezzük, nyomkövetésre több program van, az
Emacs a GNU gdb programot támogatja. Támogatja ezeken kívül
még a GNU RCS és az SCCS karbantartó rendszerek használatát
is. Nem elhanyagolható az sem, hogy ablakban tudunk Unix
shellt futtatni.
A programfordítás a compile parancs kiadásával történik
([Alt X] @Kcompile@N). Ezután meg kell mondani, hogy milyen Unix
shell parancs végrehajtásával fordul le a programunk. A
parancs végrehajtására külön processz indul, ez azt jelenti,
hogy a fordítással párhuzamosan mást is csinálhatunk. A
parancs kimenete külön ablakba kerül. Ennek az ablaknak a
tartalma alapján az [Alt X] @Knext-error@N paranccsal (ez
alapértelmezésben az [Alt `] (a Tab feletti aposztrof)
billentyû lenyomásakor hajtódik végre) végigmehetünk az
összes -- a fordító által talált -- hibán, és még a fordítás
befejezéséig kijavíthatjuk ôket, hogy a második próbálkozás
után már tökéletesen mûködjön.
Jól használható dolgok az úgynevezett rövidítések
(abbrev.) Ezek olyan szavak, amelyeket nem kell végig
begépelni, csak néhány betût; ezek a [Space] lenyomása után
ki lesznek cserélve a rövidítés definíciójában megadott
szóra (nem szükséges tehát, hogy egyáltalán szerepeljen a
rövidítésben a rövidített szó akár egyetlen karaktere is).
Ez jelentôsen megnövelheti a gépelési sebességet. Nagyon
hasznos programok begépelése esetén is, hiszen például a
Smalltalk nyelv esetében egy-egy új osztály létrehozásakor
elküldött üzenet (ami még csak létrehozza az új osztályt)
legalább öt sornyi -- és unalmas minden alkalommal beírni,
hogy
@KObject subclass:
@KinstanceVariableNames: ''
@KclassVariableNames: ''
@KpoolDictionaries: ''
@Kcategory: nil !@N
Sokkal egyszerûbb definiálni egy abbrevet, ami mondjuk a
""qwer" szóhoz ezt rendeli. Ezt persze nemcsak programozás
során lehet kihasználni, nagyon hasznos akármilyen szöveg
gépelésénél.
Még egy fontos lehetôség az úgynevezett TAGS táblázat
használata. Ez egy kifejezetten a C/C++ programozást
támogató eszköz. Használatával egyszerûen lehet oda-vissza
mozogni a forrásmodulok -- függvénydefiníciók között. Egy
TAGS file tartalmazza a függvény és makródefiníciók egy-egy
forrásmodulbeli elhelyezkedését. Egy, az Emacs számára
elfogadható formátumú TAGS file-t az etags programmal
hozhatunk létre. Használata egyszerû: ""etags
forrásfile-ok". Ez létrehoz egy TAGS nevû file-t, amit az
[Alt X] @Kvisit-tags-table@N paranccsal tölthetünk be. Ezekután
az [Alt .] billentyûkkel lehet a TAGS file-ban leírt
függvénydefiníciók, stb. között mozogni. Természetesen nem
kell minden egyes változtatás után újra lefuttatni az etags
programot, mivel az Emacs megtalálja a megfelelô
definíciókat akkor is, ha már nem pontosan ott (esetleg nem
is ugyanabban a forrásmodulban) vannak.
És még egy érdekes lehetôség: az [Alt Tab] billentyûkkel
lehet kiegészíteni a megkezdett függvények nevei. Például,
ha a TAGS file-ban van egy @Khosszu_nevu_fuggveny@N definíciója,
akkor elég, ha beírjuk az elsô néhány karakterét majd
lenyomjuk az [Alt Tab] billentyûket: erre (amennyiben ez az
egyetlen lehetôség) az Emacs kiegészíti (pl. @Khossz@N + [Alt
Tab] = @Khosszu_nevu_fuggveny@N).
@VA sokoldalú szövegszerkesztô@N
Annak ellenére, hogy ez az editor -- történetébôl
kifolyólag -- fôleg szöveges üzemmódú mûködésre van
tervezve, használhatjuk X alatt is. Ekkor legtöbb
lehetôségét elérhetjük menükön keresztül is -- bár sokkal
gyorsabb a megfelelô billentyûkombinációkat használni,
mintsem állandóan felemelni a kezünket a billentyûzetrôl egy
egér után kotorászva. X alatt használhatjuk a Borland IDE-k
bôl megszokott syntax highlightot a hilit19 Emacs LISP
szubrutinkönyvtár segítségével. Ez nemcsak C, C++, LISP
programozási nyelveket ismer, hanem képes a GNUS-t (Emacs-es
newsreadert) is megfelelô módon színezni.
Még rengeteg hasznos tulajdonsága, lehetôsége van az
Emacsnek ezeken kívül. Aki kíváncsi rájuk, legjobb, ha
végigolvassa a dokumentációját. Ezt a GNU Emacshez info
formátumban találjuk meg, elolvasni az info programmal
tudjuk, vagy Emacsben a [Ctrl H] [I] billentyûk
segítségével.
Persze nem ez az egyetlen programozói szövegszerkesztô
Unix alá. Sokan használják például a vi nevût; ennek -- bár
nem rendelkezik annyi funkcióval, mint az Emacs -- legfôbb
elônye könnyû fajsúlya és gyorsasága. Bár kezelését nem
sokkal könnyebb megtanulni, ez is egy kitûnô
szövegszerkesztô és rengeteg dologgal támogatja a
programozást (pl. az Emacsnél megismert TAGS file-t is a
ctags program segítségével). X alá pedig itt van például az
xcoral. Ez egy kifejezetten C/C++ programozásra való
szövegszerkesztô, sok érdekes és hasznos lehetôséggel.
Az egyik legfontosabb eszköz, amit az egész
programfejlesztés során legtöbbször használunk, a
szövegszerkesztô. Nagyon fontos tehát, hogy minden
igényünket gyorsan kielégítse, és minden részét ízlésünköz
igazíthassuk. Ezeknek a követelményeknek a legtöbb Unixos
programozható szövegszerkesztô megfelel, a lehetôségek
legszélesebb skálájával mégis az Emacs rendelkezik -- persze
méretének rovására. Ez legtöbbször nem teszi alkalmassá
egy-egy file alkalmi szerkesztgetésére, például hogy egy
külsô levelezôprogramból az Emacsel szerkesszünk levelet.
(Erre is született megoldás: az Emacs szerverprogramja. Ez
azt jelenti, hogy miután az [Alt X] @Kserver-start@N paranccsal
elindítjuk a szerverprogramot, az @Kemacsclient file-név@N
paranccsal, amit mondjuk egy másik ablakból indítunk, a már
elindított szövegszerkesztôben szerkeszthetünk.)
Összefoglalásként: mivel nagyon fontos, hogy megtaláljuk
a megfelelô eszközt programjaink begépelésére, gondosan kell
mérlegelnünk, hogy melyik az a szövegszerkesztô, amelyik
mindent tud, amit el akarunk vele végeztetni. A unixos
szövegszerkesztôknek sok típusa van, ezek közül csak egyik
az Emacs, bár a legelterjedtebbek közé tartozik. Richard
Stallman klasszikus programja most is nagyon népszerû, és az
Interneten keresztül nagyon hatékony támogatást élvez.
@KÉder Géza@N